/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gui;

import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.List;
import java.io.IOException;
import java.util.Vector;
import util.*;

/**
 *
 * @author Thiago Nascimento
 */
public class Telas {

    // Display do celular
    private Display display;
   
    // Tela de input do nome do jogador
    private Form telaNomeJogador;
    private TextField nomeJogador;
    
    // Tela com o menu inicial do jogo
    private List menuPrincipal;
    
    // Tela de conexao no servidor mostrando o nome de quem esta conectado ao jogo
    private List telaConectados;
    
    // Tela que lista os servidores disponiveis pra jogar
    private List telaServidores;
    
    // Tela de principal do jogo 
    private TelaJogo telaJogo;
    
    private List menuNivel;

    
    // CONSTRUTOR //////////////////////////////////////////////////////////////
    public Telas(Display display, CommandListener listener) {
        this.display = display;   
        
        Alert alerta = new Alert("Anker");
        alerta.setTimeout(Constantes.TIME_OUT);
        try {
            alerta.setImage(Image.createImage(Util.abrirRecurso(Constantes.IMAGE_INICIAL)));
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        this.telaNomeJogador = new Form("Nome usuário");
        this.nomeJogador = new TextField("Jogador:", "", 10, TextField.ANY);
        this.telaNomeJogador.append(this.nomeJogador);
        this.telaNomeJogador.addCommand(Constantes.CMD_OK);
        this.telaNomeJogador.setCommandListener(listener);

        this.display.setCurrent(alerta, this.telaNomeJogador);

        this.menuPrincipal = new List("Menu Principal", List.IMPLICIT, Constantes.MENU, null);
        this.menuPrincipal.addCommand(Constantes.CMD_OK);
        this.menuPrincipal.addCommand(Constantes.CMD_SAIR);
        this.menuPrincipal.setCommandListener(listener);

        this.telaConectados = new List("Conectados", List.IMPLICIT);
        this.telaConectados.addCommand(Constantes.CMD_JOGAR);
        //this.telaConectados.addCommand(Constantes.CMD_VOLTAR);
        this.telaConectados.setCommandListener(listener);
                
        this.telaServidores = new List("Servidores", List.IMPLICIT);
        this.telaServidores.addCommand(Constantes.CMD_JOGAR);
        this.telaServidores.addCommand(Constantes.CMD_VOLTAR);
        this.telaServidores.setCommandListener(listener);
        
        String[] niveis =  {"Fácil", "Normal", "Difícil"};
         this.menuNivel = new List("Nível", List.IMPLICIT, niveis, null);
        this.menuNivel.addCommand(Constantes.CMD_OK);        
        this.menuNivel.setCommandListener(listener);
    }
    
    // METODOS QUE MUDAM A TELA OU PEGAM INFORMACOES DELA //////////////////////
    public void mostrarTelaNomeJogador() {
        this.display.setCurrent(this.telaNomeJogador);
    }    
    
    public void mostrarTelaMenuPrincipal() {
        this.display.setCurrent(this.menuPrincipal);
    }
    
    public void mostrarTelaConectados() {
        this.telaConectados.deleteAll();
        this.display.setCurrent(this.telaConectados);
    }
    
    public void mostrarTelaServidores() {
        this.telaServidores.deleteAll();
        this.display.setCurrent(this.telaServidores);
    }
    
    public void mostrarTelaJogo() {
        this.display.setCurrent(this.telaJogo);
    } 
    
    public void mostrarAlerta(String mensagem) {
        Displayable tela = this.display.getCurrent();
        Alert alerta = new Alert("Erro");
        alerta.setString(mensagem);
        alerta.setTimeout(2000);
        this.display.setCurrent(alerta, tela);
    }
    
    public boolean estaNaTelaNomeJogador() {
        Displayable tela = this.display.getCurrent();
        return tela.equals(this.telaNomeJogador);
    }    
    
    public boolean estaNaTelaMenuPrincipal() {
        Displayable tela = this.display.getCurrent();
        return tela.equals(this.menuPrincipal);
    }
    
    public boolean estaNaTelaConectados() {
        Displayable tela = this.display.getCurrent();
        return tela.equals(this.telaConectados);
    }
    
    public boolean estaNaTelaServidores() {
        Displayable tela = this.display.getCurrent();
        return tela.equals(this.telaServidores);
    }
    
    public boolean estaNaTelaJogo() {
        Displayable tela = this.display.getCurrent();
        return tela.equals(this);
    }
    
    public boolean estaNaTelaNiveis() {
        Displayable tela = this.display.getCurrent();
        return tela.equals(this.menuNivel);
    }
        
    public String getNomeJogador() {
        return this.nomeJogador.getString();
    }
    
    public int getSelecaoMenuPrincipal() {
        return this.menuPrincipal.getSelectedIndex();
    }
    
    public int getSelecaoServidores() {
        return this.telaServidores.getSelectedIndex();
    }    
    
    // METODOS QUE ATUALIZAM AS TELAS DURANTE A PARTIDA ////////////////////////
    public void atualizarTelaConectados(Vector nomes) {
        for (int i = this.telaConectados.size(); i < nomes.size(); i++) {
            String nome = (String) nomes.elementAt(i);
            this.telaConectados.append(nome, null);
        }
    }
        
    public void atualizarTelaServidores(String servidor) {
        this.telaServidores.append(servidor, null);
    } 
    
    public void atualizarTelaJogo() {
        this.telaJogo.repaint();
    }
    
    public void setTitleTelaServidores(String title) {
        this.telaServidores.setTitle(title);
    }
    
    public void setTelaJogo(TelaJogo telaJogo) {
        this.telaJogo = telaJogo;
    }
    
    public void mostrarTelaMenuNivel() {
        this.display.setCurrent(this.menuNivel);
    }
    
    public int getSelecaoNivel(){
        return this.menuNivel.getSelectedIndex();
    }
   
    
}
